package images_ser

import (
	"fmt"
	"github.com/wxnacy/wgo/arrays"
	"io"
	"mime/multipart"
	"path"
	"zswei.xyz/manager/global"
	"zswei.xyz/manager/models"
	"zswei.xyz/manager/models/ctype"
	"zswei.xyz/manager/plugins/qiniu"
	"zswei.xyz/manager/utils"
)

type FileUploadResponse struct {
	FileName  string `json:"file_name"`  // 上传图片名字
	IsSuccess bool   `json:"is_success"` // 上传图片是否成功
	Desc      string `json:"desc"`       // 上传说明
}

// ImageUploadService 文件上传的方法
func (ImageService) ImageUploadService(file *multipart.FileHeader) (res FileUploadResponse) {
	fileObj, err := file.Open()          // 打开文件
	byteData, err := io.ReadAll(fileObj) //读取文件的二进制数据

	allowFileUploadType := global.Config.Upload.UploadType                   // 定义允许上传文件类型
	uploadSize := float64(file.Size) / float64(1024*1024)                    // 上传图片大小
	imgHash := utils.Md5(byteData)                                           // 使用md5哈希命名文件
	suffixName := path.Ext(file.Filename)                                    // 上传文件后缀名
	filePath := path.Join(global.Config.Upload.FilePath, imgHash+suffixName) // 上传路径
	setUploadSize := global.Config.Upload.Size                               // 设定上传图片大小限定
	res.FileName = filePath                                                  // 默认失败上传文件名字

	// 判断文件上传是否合法
	index := arrays.ContainsString(allowFileUploadType, suffixName) // 判断上传文件是否符合规范
	if index == -1 {
		res.Desc = fmt.Sprintf("上传文件类型只能是%s格式", allowFileUploadType)
		return
	}

	// 判断文件大小
	if uploadSize >= float64(setUploadSize) { // 文件超过2M不允许上传
		fmt.Sprintf("上传文件超过限制大小%dMB;上传大小为:%.2fMB", setUploadSize, uploadSize)
		return
	}

	// 保存之前在数据库查看有没有这张图片
	var bannerModel models.BannerModel
	err = global.DB.Take(&bannerModel, "hash = ?", imgHash).Error
	if err == nil {
		res.FileName = bannerModel.Path
		res.Desc = "该图片已存在无需重复上传"
		return
	}

	res.Desc = "文件上传本地成功"   // 默认文件上传本地成功
	fileType := ctype.Local // 默认上传图片到本地
	res.IsSuccess = true    // 上传成功

	// 如果上传七牛开关是打开的就上传到七牛云
	if global.Config.Upload.UploadAdd == 1 {
		filePath, err = qiniu.UploadImage(byteData, imgHash+suffixName, global.Config.QiNiu.Prefix)
		if err != nil {
			res.Desc = "文件上传七牛云失败"
			return
		}

		res.FileName = filePath
		res.IsSuccess = true
		res.Desc = "上传七牛云成功"
		fileType = ctype.QiNiu
	}

	// 图片保存入库
	global.DB.Create(&models.BannerModel{
		Path:      filePath,
		Hash:      imgHash,
		Name:      file.Filename,
		ImageType: fileType,
	})
	return
}
